/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 74646
 * Date: 2022-03-20
 * Time: 9:29
 */

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型类
 * @param <T> T：是一个占位符
 */
class MyArray<T>{
    /**
     * error
     * 不能实例化泛型类型的数组
     */
    //public T[] objects = new T[10];
   public T[] objects = (T[])new Object[10]; //这种写法并不是一个好的写法，目前只是为了代码运行起来

    //设置下标元素
    public void set(int pos ,T val){
        objects[pos] = val;
    }
    //获取下标元素
    public T get(int pos){
        return objects[pos];
    }
}

public class TestDemo {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        ArrayList<Double> arrayList2 = new ArrayList<>();
        List<? extends Number> list1 = arrayList1;
        List<? extends Number> list2 = arrayList2;
        list1.get(0);//可以通过
       // Integer i = list1.get(1); //error 编译错误，因为在获取数据时只能确定是Number的子类，但是不能确定获取的数据就是 Integer 类型
    }

    public static void main4(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        ArrayList<Double> arrayList2 = new ArrayList<>();
        List<? extends Number> list1 = arrayList1;
        List<? extends Number> list2 = arrayList2;
        //此时list的引用的子类对象有很多，再添加的时候，任何子类型都可以，为了安全，java不让这样进行添加操作。
//        list1.add(0,1); //error
//        list2.add(1,10.5); //error
    }

    public static void main3(String[] args) {
        MyArray myArray = new MyArray();
        myArray.set(0,"hello");
        myArray.set(1,123);
        System.out.println(myArray.get(0));
        System.out.println(myArray.get(1));
    }

    public static void main2(String[] args) {
        /**
         * 使用泛型类需要通过<>指定存放的数据类型
         * new MyArray<String>() -> 第二个<>里面写不写类型都可以
         */
        MyArray<String> myArray = new MyArray<String>();
        myArray.set(0,"hello");
        /**
         * error
         * 在编译时会自动进行类型检查，因为是String 类型，不可以存放整型数据
         */
        //myArray.set(1,100);
        String str = myArray.get(0); //不需要进行类型的强制转换

        //存放整型数据
        MyArray<Integer> myArray1 = new MyArray<>();
        /**
         * error
         * 基本类型不可以作为泛型类型的参数
         */
        //MyArray<int> myArray2 = new MyArray<>();
    }

    public static void main1(String[] args) {
        MyArray myArray = new MyArray();
        myArray.set(0,"hello");
        myArray.set(1,100);
        String str = (String) myArray.get(0);
        System.out.println(str);
    }
}
